# -*- coding: utf-8 -*-
# @Time    : 2023/09/19
# @Author  : Python超人
# @FileName: avatar_utils.py

# from matplotlib.font_manager import FontProperties
# import matplotlib.pyplot as plt
# import matplotlib as mpl
from img_utils import show_img  # 显示图片
import os


# mpl.rcParams['font.sans-serif'] = ['SimHei']
# FONT = FontProperties(fname=r"simsun.ttf", size=16)


# 支持的参数：
# text_position = (50, 350)     # 文字的位置
# font_size = 300            # 文字的大小
# font_color = (255, 255, 0)     # 文字的颜色
# is_horizontal 。这个参数表示文字是否横着排列，它的值可以是布尔类型（True/False），其中 True 表示横着排列，False 表示竖着排列。


def gen_avatar_with_flag(avatar_file, text, text_position=None, text_pos_offset=None, font_size=None, font_color=None,
                         is_horizontal=False):
    """
    生成带有中国五星红旗背景的头像
    @param avatar_file: 头像文件
    @param text: 文本（建议1~3个字）
    @param text_position: 文字位置（一般为空，函数已经做了自动适配）
    @param text_pos_offset: 文字位置偏移：text_pos_offset=(X, Y)， 比如：(-100, -100)
    @param font_size: 文字大小
    @param font_color: 文字颜色 font_color=(R ,G, B) 比如：红色 (255,100,100)
    @param is_horizontal: 表示文字是否横着排列， True 表示横着排列，False 表示竖着排列。
    @return:
    @return:
    """
    gen_avatar_with_bg('images/avatar_mat/五星红旗.png', avatar_file, text, text_position, text_pos_offset, font_size,
                       font_color, is_horizontal)


def gen_avatar_with_cnmap(avatar_file, text, text_position=None, text_pos_offset=None, font_size=None, font_color=None,
                          is_horizontal=False):
    """
    生成带有我爱你中国的地图背景的头像
    @param avatar_file: 头像文件
    @param text: 文本（建议1~3个字）
    @param text_position: 文字位置（一般为空，函数已经做了自动适配）
    @param text_pos_offset: 文字位置偏移：text_pos_offset=(X, Y)， 比如：(-100, -100)
    @param font_size: 文字大小
    @param font_color: 文字颜色 font_color=(R ,G, B) 比如：红色 (255,100,100)
    @param is_horizontal: 表示文字是否横着排列， True 表示横着排列，False 表示竖着排列。
    @return:
    @return:
    """
    gen_avatar_with_bg('images/avatar_mat/我爱你中国.png', avatar_file, text, text_position, text_pos_offset, font_size,
                       font_color, is_horizontal)


# generateAvatarWithFlag
def gen_avatar_with_bg(bg_image, avatar_file, text, text_position=None, text_pos_offset=None, font_size=None,
                       font_color=None, is_horizontal=False):
    """
    生成指定背景的头像
    @param bg_image: 背景模板文件
    @param avatar_file: 头像文件
    @param text: 文本（建议1~3个字）
    @param text_position: 文字位置（一般为空，函数已经做了自动适配）
    @param text_pos_offset: 文字位置偏移：text_pos_offset=(X, Y)， 比如：(-100, -100)
    @param font_size: 文字大小
    @param font_color: 文字颜色 font_color=(R ,G, B) 比如：红色 (255,100,100)
    @param is_horizontal: 表示文字是否横着排列， True 表示横着排列，False 表示竖着排列。
    @return:
    """
    from PIL import Image, ImageDraw, ImageFont

    if "/" not in avatar_file and "\\" not in avatar_file:
        avatar_file = f"images/avatar_mat/{avatar_file}"

    text_len = len(str(text).replace("\n", ""))

    if not is_horizontal and '\n' not in text:
        text = "\n".join(text)

    if text_pos_offset is None:
        text_pos_offset = (0, 0)

    #     print("text_len",text_len)

    if text_position is None:
        if text_len == 1:
            text_position = (35, 430)
        elif text_len == 2:
            text_position = (90, 330)
        elif text_len >= 3:
            text_position = (130, 280)

    text_position = (text_position[0] + text_pos_offset[0], text_position[1] + text_pos_offset[1])

    if font_size is None:
        if text_len == 1:
            font_size = 400
        elif text_len == 2:
            font_size = 300
        elif text_len >= 3:
            font_size = 220

    if font_color is None:
        font_color = (240, 240, 0)

    output_name = os.path.basename(avatar_file)
    output_name = output_name.split(".")[0]
    output_name = output_name + "-" + str(text).replace("\n", "")

    output_file = f'output/{output_name}-国庆头像1.png'

    bg = Image.open(bg_image).convert("RGBA")
    av = Image.open(avatar_file).convert("RGBA")

    merged = Image.new("RGBA", bg.size)

    av = av.resize(bg.size)
    av_width, av_height = av.size

    trim_width = av_width // 6

    av = av.crop((0, 0, av_width - trim_width, av_height))

    merged.paste(av, (trim_width, 0))

    merged = Image.alpha_composite(merged, bg)

    # 在图片上绘制文字
    draw = ImageDraw.Draw(merged)
    font = ImageFont.truetype("fonts/C003_0.ttf", font_size)  # 设置字体和大小
    #     draw_shadow(draw,text,text_position, font=font)
    #     draw.text(text_position, text, font=font, fill=font_color)

    draw_text(draw, text, text_position, font, font_color)

    dir_name = os.path.dirname(output_file)
    if not os.path.exists(dir_name):
        os.mkdir(dir_name)

    merged.save(output_file)
    print("头像已经生成，文件路径：", output_file)
    show_img(merged)


#     return output_file


def draw_shadow(draw, text, text_position, font, shadow_color=(100, 0, 0, 240)):
    """
    会话文字的立体效果（高亮+阴影）
    @param draw:
    @param text:
    @param text_position:
    @param font:
    @param shadow_color:
    @return:
    """
    x, y = text_position
    draw.text((x + 10, y + 10), text, font=font, fill=shadow_color)  # 阴影效果
    draw.text((x - 3, y - 3), text, font=font, fill=(255, 255, 255, 128))  # 高亮效果


def draw_text(draw, text, text_position, font, text_color):
    """
    绘画文本图像
    @param draw:
    @param text:
    @param text_position:
    @param font:
    @param text_color:
    @return:
    """
    # Specify the spacing between characters
    spacing = -50
    x, y = text_position
    # Iterate over each character in the text
    #     x = text_position[0]
    for c in text:
        if c == '\n':
            x, _ = text_position
            y += (font.getsize(c)[0] * 1.05) + spacing
            continue
        # Draw each character separately with adjusted x position
        draw_shadow(draw, c, (x, y), font=font)
        draw.text((x, y), c, font=font, fill=text_color)

        # Increment x position by character width and spacing
        x += font.getsize(c)[0] + spacing


def gen_avatar_with_gq(tpl_image, text, text_position=None, text_pos_offset=(0, 0), font_size=None, font_color=None,
                       is_horizontal=True):
    """
    生成带有国庆主题的头像
    @param tpl_image: 国庆主题模板文件
    @param text: 文本（建议1~3个字）
    @param text_position: 文字位置（一般为空，函数已经做了自动适配）
    @param text_pos_offset: 文字位置偏移：text_pos_offset=(X, Y)， 比如：(-100, -100)
    @param font_size: 文字大小
    @param font_color: 文字颜色 font_color=(R ,G, B) 比如：红色 (255,100,100)
    @param is_horizontal: 表示文字是否横着排列， True 表示横着排列，False 表示竖着排列。
    @return:
    """
    from PIL import Image, ImageDraw, ImageFont

    if "/" not in tpl_image and "\\" not in tpl_image:
        tpl_image = f"images/avatar_mat/{tpl_image}"

    text_len = len(str(text).replace("\n", ""))

    if not is_horizontal and '\n' not in text:
        text = "\n".join(text)

    #     print(text)
    if text_position is None:
        if text_len == 1:
            text_position = (320 + text_pos_offset[0], 320 + text_pos_offset[1])
        elif text_len == 2:
            text_position = (300 + text_pos_offset[0], 380 + text_pos_offset[1])
        elif text_len >= 3:
            text_position = (290 + text_pos_offset[0], 430 + text_pos_offset[1])

    if font_size is None:
        if text_len == 1:
            font_size = 380
        elif text_len == 2:
            font_size = 220
        elif text_len >= 3:
            font_size = 200

    if font_color is None:
        font_color = (240, 240, 0)

    bg = Image.open(tpl_image).convert("RGBA")
    draw = ImageDraw.Draw(bg)
    font = ImageFont.truetype("fonts/C003_0.ttf", font_size)  # 设置字体和大小

    #     draw.text(text_position, text, font=font, fill=font_color)
    draw_text(draw, text, text_position, font, font_color)

    output_name = os.path.basename(tpl_image)
    output_name = output_name.split(".")[0]

    output_name = str(text).replace("\n", "") + "-" + output_name

    output_file = f'output/{output_name}.png'

    bg.save(output_file)
    print("头像已经生成，文件路径：", output_file)
    show_img(bg)


#     return output_file

def gen_avatar_with_gq1(text, text_pos_offset=None, font_size=None, font_color=None, is_horizontal=True):
    """
    生成带有国庆主题的头像
    @param text: 文本（建议1~3个字）
    @param text_pos_offset: 文字位置偏移：text_pos_offset=(X, Y)， 比如：(-100, -100)
    @param font_size: 文字大小
    @param font_color: 文字颜色 font_color=(R ,G, B) 比如：红色 (255,100,100)
    @param is_horizontal: 表示文字是否横着排列， True 表示横着排列，False 表示竖着排列。
    @return:
    """
    text_len = len(str(text).replace("\n", ""))

    if text_len == 1:
        base_pos_offset = (0, 0)
    elif text_len == 2:
        base_pos_offset = (20, 0)
    elif text_len >= 3:
        base_pos_offset = (-30, -50)

    if text_pos_offset is None:
        text_pos_offset = (0, 0)

    text_pos_offset = (text_pos_offset[0] + base_pos_offset[0], text_pos_offset[1] + base_pos_offset[1])
    return gen_avatar_with_gq(tpl_image="国庆头像背景1.jpg", text=text, text_pos_offset=text_pos_offset, font_size=font_size,
                              font_color=font_color, is_horizontal=is_horizontal)


def gen_avatar_with_gq2(text, text_pos_offset=None, font_size=None, font_color=None, is_horizontal=True):
    """
    生成带有国庆主题的头像
    @param text: 文本（建议1~3个字）
    @param text_pos_offset: 文字位置偏移：text_pos_offset=(X, Y)， 比如：(-100, -100)
    @param font_size: 文字大小
    @param font_color: 文字颜色 font_color=(R ,G, B) 比如：红色 (255,100,100)
    @param is_horizontal: 表示文字是否横着排列， True 表示横着排列，False 表示竖着排列。
    @return:
    """
    text_len = len(str(text).replace("\n", ""))
    if text_len == 1:
        base_pos_offset = (280, -150)
    elif text_len == 2:
        base_pos_offset = (280, -150)
    elif text_len >= 3:
        base_pos_offset = (250, -200)

    if text_pos_offset is None:
        text_pos_offset = (0, 0)

    text_pos_offset = (text_pos_offset[0] + base_pos_offset[0], text_pos_offset[1] + base_pos_offset[1])
    return gen_avatar_with_gq(tpl_image="国庆头像背景2.jpg", text=text, text_pos_offset=text_pos_offset, font_size=font_size,
                              font_color=font_color, is_horizontal=is_horizontal)


def gen_avatar_with_gq3(text, text_pos_offset=None, font_size=None, font_color=None, is_horizontal=True):
    """
    生成带有国庆主题的头像
    @param text: 文本（建议1~3个字）
    @param text_pos_offset: 文字位置偏移：text_pos_offset=(X, Y)， 比如：(-100, -100)
    @param font_size: 文字大小
    @param font_color: 文字颜色 font_color=(R ,G, B) 比如：红色 (255,100,100)
    @param is_horizontal: 表示文字是否横着排列， True 表示横着排列，False 表示竖着排列。
    @return:
    """
    text_len = len(str(text).replace("\n", ""))
    if text_len == 1:
        base_pos_offset = (0, 0)
    elif text_len == 2:
        base_pos_offset = (0, 0)
    elif text_len >= 3:
        base_pos_offset = (-30, -20)

    if text_pos_offset is None:
        text_pos_offset = (0, 0)

    text_pos_offset = (text_pos_offset[0] + base_pos_offset[0], text_pos_offset[1] + base_pos_offset[1])
    return gen_avatar_with_gq(tpl_image="国庆头像背景3.jpg", text=text, text_pos_offset=text_pos_offset, font_size=font_size,
                              font_color=font_color, is_horizontal=is_horizontal)


def gen_avatar_with_gq4(text, text_pos_offset=None, font_size=None, font_color=None, is_horizontal=True):
    """
    生成带有国庆主题的头像
    @param text: 文本（建议1~3个字）
    @param text_pos_offset: 文字位置偏移：text_pos_offset=(X, Y)， 比如：(-100, -100)
    @param font_size: 文字大小
    @param font_color: 文字颜色 font_color=(R ,G, B) 比如：红色 (255,100,100)
    @param is_horizontal: 表示文字是否横着排列， True 表示横着排列，False 表示竖着排列。
    @return:
    @return:
    """
    text_len = len(str(text).replace("\n", ""))
    if text_len == 1:
        base_pos_offset = (-20, -40)
    elif text_len == 2:
        base_pos_offset = (0, 0)
    elif text_len >= 3:
        base_pos_offset = (-100, -50)

    if text_pos_offset is None:
        text_pos_offset = (0, 0)

    text_pos_offset = (text_pos_offset[0] + base_pos_offset[0], text_pos_offset[1] + base_pos_offset[1])
    return gen_avatar_with_gq(tpl_image="国庆头像背景4.jpg", text=text, text_pos_offset=text_pos_offset, font_size=font_size,
                              font_color=font_color, is_horizontal=is_horizontal)


def gen_avatar_with_gq5(text, text_pos_offset=None, font_size=None, font_color=None, is_horizontal=True):
    """
    生成带有国庆主题的头像
    @param text: 文本（建议1~3个字）
    @param text_pos_offset: 文字位置偏移：text_pos_offset=(X, Y)， 比如：(-100, -100)
    @param font_size: 文字大小
    @param font_color: 文字颜色 font_color=(R ,G, B) 比如：红色 (255,100,100)
    @param is_horizontal: 表示文字是否横着排列， True 表示横着排列，False 表示竖着排列。
    @return:
    """
    text_len = len(str(text).replace("\n", ""))
    if text_len == 1:
        base_pos_offset = (0, 50)
    elif text_len == 2:
        base_pos_offset = (0, 50)
    elif text_len >= 3:
        base_pos_offset = (-100, 0)

    if text_pos_offset is None:
        text_pos_offset = (0, 0)

    text_pos_offset = (text_pos_offset[0] + base_pos_offset[0], text_pos_offset[1] + base_pos_offset[1])

    return gen_avatar_with_gq(tpl_image="国庆头像背景5.jpg", text=text, text_pos_offset=text_pos_offset, font_size=font_size,
                              font_color=font_color, is_horizontal=is_horizontal)
